【代码相关】Fast Loop的一个BUG以及反过来利用的方法
id: 4132269901 | 楼主:lyh娘 | 返回首页
id: 78288453396
1L | 作者:lyh娘 | 发布于 2015-10-31 02:09

原本应该发MFE吧一份本吧一份,结果忘发本吧了

不知道还有多少人记得,RE开发早期石盾各种抽风,然后我百思不得其解最后只得加入ForEach循环解决
现在我终于知道了原因了,很多MMF里的抽风都是这个原因,所以来发个帖免得更多人被坑。。
假设现在我们有如下的代码
1 On loop "循环"
--- 任意操作(不能为空)
2 选出某个物品
--- 这里的操作对条件里选出的物品起效
--- Start loop "循环"
--- 这里的操作对所有物品起效
快速循环会导致条件里选出的物品范围失效(ForEach不受此影响)
前面说的RE里的石盾,就是因为用了快速循环来防止卡进地里,导致同一行里的后续代码对所有石盾执行了……



id: 78288460156
2L | 作者:lyh娘 | 发布于 2015-10-31 02:10

下面举一个反过来利用这个bug的例子
比如现在我要制作链条的音效,条件为:没有链条在屏幕内时停止音效,否则开启音效
MMF是只能判断“有”链条在屏幕内/“有”链条在屏幕外的,不能判断“没有”链条在屏幕内
之前我的解决方法是在屏幕上覆盖了一个很大很大的Active然后检测重叠(这还是在试了半小时无解后用的方法)
但是知道这个方法后就可以这么写了:
1 On loop "选取所有物品"
--- Player 1: Set player name to "" //等效于什么都不做,当然如果你用了这个变量那另说
2 x 链条 is getting closer than -64 pixels from window's edge //选取“在”屏幕内的链条
--- Start loop "选取所有物品" 1 times //选取所有的链条
--- 链条: Set internal flag 31 on //此时所有的链条要么这个开关均为On要么均为Off
3 链条: internal flag 31 is on //屏幕里有链条
- x Liantiao is playing
--- Play sample Liantiao 0 times
4 链条: internal flag 31 is off //屏幕里没有链条
--- Stop sample Liantiao
5 Always
--- 链条: Set internal flag 31 off
当然其实这段代码还有一种不利用这个BUG的等效写法:
1 On loop "对所有链条执行"
--- 链条: Set internal flag 31 on
2 x 链条 is getting closer than -64 pixels from window's edge //选取“在”屏幕内的链条
--- Start loop "对所有链条执行" 1 times //因为跳出了这行语句所以会对所有链条执行
但是这种写法每一处这样的地方都要多加一个循环,多了的话会感觉很蛋疼,而前面一种写法的话只需要一个“什么都不做”的循环,代码也更简洁了



id: 78288501436
3L | 作者:lyh娘 | 发布于 2015-10-31 02:12

我正在制作的RMM大量利用了此“bug”的效果
而且这是目前为止唯一一个通过选择物品的条件触发事件后却让事件对所有物品执行的方法
或许正是因为这点 这个bug才没有修复 将来也不会被修复



id: 78289923521
4L | 作者:gurcd | 发布于 2015-10-31 03:55

lyh换头像了


id: 78301088132
5L | 作者:Anti_Tencent | 发布于 2015-10-31 11:25

Bug和特性的区别其实很小……